package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IGysInfoDAO;
import org.jsola.hr.dto.*;
import org.jsola.hr.dto.excel.GysInfoImportDTO;
import org.jsola.hr.entity.GysInfoDO;
import org.jsola.hr.query.ExportColumn;
import org.jsola.hr.query.GysInfoQuery;
import org.jsola.hr.vo.FormGroupVO;
import org.jsola.hr.vo.GysInfoListVO;
import org.jsola.hr.vo.GysInfoVO;
import org.jsola.hr.vo.HeaderVo;
import org.jsola.hr.vo.excel.GysInfoExportVO;
import org.jsola.hr.vo.excel.ParseResultVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 供应商信息表
 *
 * @author zhr
 */
public interface IGysInfoService extends IService<IGysInfoDAO, GysInfoDO> {

    /**
     * 新增供应商信息表
     *
     * @param gysInfoAddDTO 新增供应商信息表DTO
     * @param tokenUser     当前用户
     * @return 供应商信息表详情信息
     */
    GysInfoVO save(GysInfoAddDTO gysInfoAddDTO, TokenUser tokenUser);

    /**
     * 批量新增供应商信息表
     * @param gysInfoAddDTOList 新增供应商信息表DTO
     * @param tokenUser 当前用户
     * @return 供应商信息表详情信息
     */
    List<GysInfoVO> batchSave(List<GysInfoAddDTO> gysInfoAddDTOList, TokenUser tokenUser);

    /**
     * 修改供应商信息表
     *
     * @param gysInfoUpdateDTO 修改供应商信息表DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(GysInfoUpdateDTO gysInfoUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除供应商信息表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param gysInfoIds 供应商信息表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... gysInfoIds);

    /**
     * 根据供应商信息表id查找
     *
     * @param gysInfoId 供应商信息表id
     * @param siteId    所属站点id
     * @return 供应商信息表详情信息
     */
    GysInfoVO selectById(String gysInfoId, String siteId);

    /**
     * 查询供应商信息表
     *
     * @param gysInfoQuery 查询条件
     * @param siteId       所属站点id
     * @return 供应商信息表列表信息
     */
    List<GysInfoListVO> select(GysInfoQuery gysInfoQuery, String siteId);

    /**
     * 查询供应商信息表记录数
     *
     * @param gysInfoQuery 查询条件
     * @param siteId       所属站点id
     * @return 供应商信息表记录数
     */
    int selectCount(GysInfoQuery gysInfoQuery, String siteId);

    /**
     * 分页查询供应商信息表
     *
     * @param gysInfoQuery 查询条件
     * @param siteId       所属站点id
     * @return 供应商信息表列表信息
     */
    Page<GysInfoListVO> selectPage(GysInfoQuery gysInfoQuery, String siteId);

    /**
     * 供应商分页数据 + 表头
     * @param gysInfoQuery
     * @param tokenUser
     * @return
     */
    Page<Map> selectPageAllField(GysInfoQuery gysInfoQuery, TokenUser tokenUser);

    /**
     * 查询动态表头
     * @return
     */
    HeaderVo head(TokenUser tokenUser);

    /**
     * 查询所有动态字段的值
     * @param gysInfoQuery
     * @param siteId
     * @return
     */
    List<List<String>> allFieldValue(GysInfoQuery gysInfoQuery, List<String> enNameHeader, String siteId);


    /**
     * 根据供应商信息表id查找
     *
     * @param gysInfoId 供应商信息表id
     * @param siteId    所属站点id
     * @return 供应商信息表
     */
    GysInfoDO selectDOById(String gysInfoId, String siteId);

    /**
     * 查询供应商信息表
     *
     * @param gysInfoQuery 查询条件
     * @param siteId       所属站点id
     * @return 供应商信息表列表
     */
    List<GysInfoDO> selectDO(GysInfoQuery gysInfoQuery, String siteId);

    /**
     * 根据供应商分组Id列表查询对应供应商分组下的所有供应商
     *
     * @param childGroupIdList 供应商Id列表
     * @param tokenUser        当前用户
     * @return 供应商列表
     */
    List<GysInfoDO> selectGysByGroupIdList(List<String> childGroupIdList, TokenUser tokenUser);

    GysInfoVO saveGsyInfo(GysAddDTO gysAddDTO, TokenUser tokenUser);

    List<FormGroupVO> findGsyById(String gysInfoId, String siteId);

    /**
     * 查询要导出的供应商信息表
     * @param gysInfoQuery 查询条件
     * @param siteId 所属站点id
     * @return 要导出的供应商信息表列表
     */
    List<GysInfoExportVO> selectExportList(GysInfoQuery gysInfoQuery, String siteId);

    /**
     * 解析要导入的excel并返回解析结果
     * @param file 文件
     * @param success 是否只返回解析成功的，如果false，则只返回失败的，为null全部返回
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    List<ParseResultVO<GysInfoImportDTO>> parseImportFile(File file, Boolean success, TokenUser tokenUser);

    /**
     * 导入excel，导入前会校验数据，如果有失败的数据则不导入
     * @param file excel
     * @param tokenUser 当前用户
     * @param force true忽略错误的行，false有错误中断上传
     * @return 成功的条数
     */
    Integer importFile(File file, TokenUser tokenUser, Boolean force);

    /**
     * 更新供应商信息
     * @param gysUpdateDTO
     * @param tokenUser
     * @return
     */
    Integer updateGsyInfo(GysUpdateDTO gysUpdateDTO, TokenUser tokenUser);
}


